package org.zjt.scala.book

/**
  *
  * Description:
  *
  *  1、伴生对象的继承  object 继承
  *  2、abstract class 、trait 、class 的继承
  *  2、继承方法、字段的覆盖
  *  3、父类利用子类方法的覆盖属性的问题：
  *     3.1、父子构造顺序（ 创建对象的内存，构造属性的零值 -> 调用构造方法  每个流程都是子到父）、
  *     3.2、scala 访问属性名，是调用的是属性的getter方法
  *  4、枚举
  *     4.1、继承 Enumeration
  *     4.2、属性使用 value 来设置顺序
  *
  *
  *
  * @author juntao.zhang
  *         Date: 2018-06-27 下午9:46
  * @see
  */
class Chapter6 {


}

/**
  * 特征
  */
trait Person3{

  def action{
    println("-------action--------")
  }

}

/**
  * 伴生对象的继承
  */
object Student3 extends Person3{

  val score : Float = 12

  override def action { super.action ; println(s"-------object Student score:$score-------") }

}

/**
  * 类继承
  */
class Student4 extends Person3{

  val score : Float = 0

  override def action { super.action ; println(s"-------class Student score: $score-------") }

}


/**
  * 类继承之类属性的覆盖
  */
class CollegeStudent extends Student4{

  override val score : Float = 0

}

/***
  * 枚举
  */
class Color extends Enumeration{   // 1、继承Enumeration类

  val Red,Yellow,Blue,Green = Value  // 2、必须生成下一个id
}


/**
  * 每个步骤都是从子类到父类
  *
  *  加载 class -> ...... -> bean创建 -> bean 属性零值 -> 构造赋值
  *
  *  证明点：
  *   1、父类构造时候，子类只在零值状态。所以this的range 为0 ,不为 2。
  *   2、range 调用的是getter方法。java 使用 range getter 方法才会出现这个情况。
  *
  */
class MyCollection {

  /** 定义bean属性 **/
  val range:Int = 10

  var env:Array[Int] = new Array[Int](range)

}


class ArrayCollection extends MyCollection{

  override val range:Int = 2

}


object Chapter6 extends App {

  Student3.action

  new Student4().action


  new Color().Blue

  println(new ArrayCollection().env.length)

}